package cn.smxy.user.service;

import cn.smxy.excel.UserExcel;
import cn.smxy.param.*;
import cn.smxy.pojo.User;
import cn.smxy.util.R;
import com.baomidou.mybatisplus.extension.service.IService;

import java.net.MalformedURLException;
import java.util.List;

public interface UserService extends IService<User> {
    /**
     * 校验用户账号
     * 1.数据库查询是否存在相同账号
     * 2.返回结果封装
     * @param userCheckParam 用户账号
     * @return 结果封装
     */
    R check(UserCheckParam userCheckParam);

    /**
     * 用户注册
     * 1.正则校验账号是否符合规则
     * 2.数据库查询是否存在相同账号
     * 3.密码加密加盐
     * 4.设置用户初始值
     * 5.数据插入数据库
     * 6.返回结果封装
     * @param user 用户实体类
     * @return 结果封装
     */
    R register(User user);

    /**
     * 用户登录
     * 1.用户密码加密
     * 2.比对数据库账号密码
     * 3.返回用户完整对象(为保护用户密码安全不返回密码)
     * @param loginAccountParam 用户登录参数，账号密码
     * @return 用户完整对象
     */
    R loginAccount(LoginAccountParam loginAccountParam);

    /**
     * 修改用户信息
     * 1.检查密码，如果与数据库一致 不需要加密，证明密码没有修改
     * 2.密码不同，已经修改，新密码加密
     * 3.数据库修改
     * @param user 用户实体类
     * @return
     */
    R update(User user);

    /**
     * 返回用户基本信息
     * 用户名 用户头像 高校id
     * @param userId 用户id
     * @return
     */
    User basic(Long userId);

    /**
     * excel批量导入
     * 1.用户密码加盐加密
     * 2.批量添加数据库
     * @param list
     */
    void saveExcel(List<User> list);

    /**
     * excel批量导出
     * 1.将User转换成UserExcel，更适合展示
     * @return
     */
    List<UserExcel> getAll() throws MalformedURLException;

    /**
     * 模糊查询用户名
     * @param userSearchParam
     * @return
     */
    R search(UserSearchParam userSearchParam);

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    R info(Long userId);

    /**
     * 用户退出登录
     * @param token
     * @return
     */
    R logout(String token);

    /**
     * 获取用户名称
     * @param userId
     * @return
     */
    User getUserName(Long userId);

    /**
     * 检查是否存在重复邮箱
     * @param userEmail
     * @return
     */
    Long checkEmail(String userEmail);

    /**
     * 发送验证码，并保存redis
     * @param emailParam
     * @return
     */
    R toEmail(EmailParam emailParam);

    /**
     * 用户邮箱登录
     * @param loginEmailParam
     * @return
     */
    R loginEmail(LoginEmailParam loginEmailParam);

    /**
     * 用户绑定邮箱
     * @param loginEmailParam
     * @return
     */
    R bindEmail(LoginEmailParam loginEmailParam);

    /**
     * 删除用户
     * 1.删除用户对应的作品
     * 2.校园认证
     * 3.校园作品
     * 4.评论
     * 5.植物作品
     * @param userId
     * @return
     */
    R delete(Long userId);
}
